#!/usr/bin/python
#coding=utf-8

import sys
sys.path.append('..')
import xlrd
import float_calc.floatcalc_ply as calc

class ParserError(Exception):
    def __init__(self, value):
	    self.value = value
    def __str__(self):
        return repr(self.value)
class ErrorSyntaxExcel(ParserError): pass

class ParseExcel:
	def empty(self, row): # Ячейка или строка пусты с учетом комментирования
		if type(row)!=type("") and type(row)!=type([]):
			return 0
		if row == "" or row[0] == '#': # Если row строка
			return 1
		q = 1
		for col in row: # Если row список строк
			if col == "":
				continue
			if str(col)[0] != '#':
				q = 0
				break
		return q

	def empty_real(self, row): # Строка или список реально пусты
		if type(row)!=type("") and type(row)!=type([]):
			return 0
		if row == "": # Если row строка
			return 1
		q = 1
		for col in row: # Если row список строк
			if col != "":
				q = 0
				break
		return q			

	def f_var(self, rownum):
		rownum += 1
		while rownum < len(self.table): 
			row = self.table[rownum]
			if self.empty_real(row):
				return rownum + 1
			if row[0] == "#":
				rownum += 1
				continue	
			
			self.var_dict[row[0]] = row[1] # Добавляем переменные в словарь
			
			rownum += 1
		return rownum	

	def f_tranz(self, rownum):
		key = [k for k in self.table[rownum] if k != ""]
		rownum += 1
		#print rownum, len(self.table)
		while rownum < len(self.table): 
			key_dict = {}
			row = self.table[rownum]
			if self.empty_real(row):
				return rownum + 1
			if row[0] == "#":
				rownum += 1
				continue	
						
			if self.empty(row[0]): # Определяем имя строки
				name = "_test_" + str(rownum + 1)
				isName = 0 # Флаг именнованности строки			
			else:
				name = row[0]		
				isName = 1
			self.name_tranz[name] = key[0] # Запоминаем тип заявки
			for colnum in range(1, len(key)): # Проход по столбцам
				head, value = key[colnum], row[colnum]
				if self.empty(value): # Данная ячейка пуста
					key_dict[head] = ""	
				elif head in self.formula_col: # header ячейки формульный
					key_dict[head] = calc.formula(value, self.var_dict) # Вычисляем значение ячейки с учетом переменных (colnum+1 сместилась нумерация из-за первого столбца)
				else:
					if value in self.var_dict: # Строковая ячейка есть в словаре переменных
						key_dict[head] = self.var_dict[value]
					else:
						key_dict[head] = value
				if isName: # Строка именованна
					self.var_dict[name+':'+head] = key_dict[head] # Добавляем в словарь новую переменную	
			self.ordersData[name] = key_dict # Формируем результат	
			
			rownum += 1
		return rownum

	'''
	def f_example(self, rownum):
		while rownum < len(self.table): 
			row = self.table[rownum]
			if self.empty_real(row):
				return rownum + 1			
			if row[0] == "#":
				rownum += 1
				continue	

			#Здесь пишем реализацию, используем row

			rownum += 1
		return rownum			
	'''	

	def data(self):
		res = self.ordersData
		def f_int_word(s):
			return int(s.split('.')[0])	
		
		def f_float_word(s):
			return float(s)
		
		def f_time_word(s):
			try:
				f = float(s) # Ловим исключение здесь
				t = round(f * 86400)
				s = ("%0.2d%0.2d%0.2d" % (t/(60*60), t%(60*60)/60, t%60) )
			except:
				s = "".join(s.split(':'))	
			finally:	
				return s		

		def f_date_word(s):
			try:
				f = int(float(s))
				date_s = xlrd.xldate_as_tuple(f, 0)
				s = ("%0.2d%0.2d%0.2d" % (date_s[0], date_s[1], date_s[2]))
			except:
				s = "".join(s.split('.')[::-1])
			finally:	
				return s	

		handle_type = ( (self.int_word, f_int_word), (self.float_word, f_float_word), 
						(self.time_word, f_time_word), (self.date_word, f_date_word)
					  )

		for name in res: # названия строк
			for head in res[name]: # названия столбцов
				for word in handle_type: # типы данных
					if head in word[0] and res[name][head] != "":
						res[name][head] = word[1](res[name][head])						
		return res					

	def __init__(self, file_name, key_word):
	# TODO Функции, процедуры
		f =  open(file_name, 'r')
		self.table = []
		for row in f.readlines():
			row = row.strip()
			st = row.split(';')
			self.table.append(map(lambda s : s.upper().strip(), st))
			
		#print self.table

		self.int_word = ["QUANTITY", "HIDDEN", "LQTY", ]
		self.float_word = ["PRICE", "LPRICE", "KEY1", "KEY2", "KEY4", ]
		self.date_word = ["SETTLEDATE", ]
		self.time_word = ["ACTIVATIONTIME", ]
		self.formula_col = self.float_word+self.int_word

		self.name_tranz = {} # таблица имя строки -> тип транзакции
		self.ordersData, self.var_dict = {}, {} # результат, накопленные переменные
		rownum = 0 # номер текущей строки
		handle = {"VAR":self.f_var, "ORDERS":self.f_tranz, "RCORDERS":self.f_tranz,"NEGDEALS":self.f_tranz,
				"RNEGDEALS":self.f_tranz,"RCNEGDEALS":self.f_tranz,"PRIMARY":self.f_tranz,"TRANSFERS":self.f_tranz}
		for k in key_word: # Добавляем свои слова
			handle[k.upper()] = self.f_tranz

		while rownum < len(self.table): # Главный цикл по строкам
			row = self.table[rownum]
			if row[0] in handle:
				rownum = handle[row[0]](rownum)
			elif self.empty(row): # Пропускаем комментарии и пустые строки					
				rownum += 1
				continue
			else:
				raise ErrorSyntaxExcel("Unknown 1 col %s" % row[0])
	
	def write_res(self):
		print (self.data())
		print (self.name_tranz)
		
if __name__ == '__main__':
	a = ParseExcel("test\\res.csv", ["NewWord"])
	a.write_res()


